package cn.iocoder.yudao.module.shop.service.daystatistics;

import java.time.LocalDateTime;
import java.util.*;
import javax.swing.*;
import javax.validation.*;

import cn.iocoder.yudao.module.pay.dal.dataobject.wallet.PayWalletRechargeDO;
import cn.iocoder.yudao.module.shop.controller.admin.daystatistics.vo.*;
import cn.iocoder.yudao.module.shop.dal.dataobject.daystatistics.ShopDayStatisticsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.shop.dal.dataobject.order.ShopOrderDO;
import cn.iocoder.yudao.module.shop.enums.store.ChargeTypeEnum;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;

/**
 * 每日手工费统计 Service 接口
 *
 * @author 曹建伟
 */
public interface ShopDayStatisticsService {

    /**
     * 创建每日手工费统计
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createDayStatistics(@Valid ShopDayStatisticsCreateReqVO createReqVO);

    /**
     * 更新每日手工费统计
     *
     * @param updateReqVO 更新信息
     */
    void updateDayStatistics(@Valid ShopDayStatisticsUpdateReqVO updateReqVO);

    /**
     * 删除每日手工费统计
     *
     * @param id 编号
     */
    void deleteDayStatistics(Long id);

    /**
     * 获得每日手工费统计
     *
     * @param id 编号
     * @return 每日手工费统计
     */
    ShopDayStatisticsDO getDayStatistics(Long id);

    /**
     * 获得每日手工费统计列表
     *
     * @param ids 编号
     * @return 每日手工费统计列表
     */
    List<ShopDayStatisticsDO> getDayStatisticsList(Collection<Long> ids);

    /**
     * 获得每日手工费统计分页
     *
     * @param pageReqVO 分页查询
     * @return 每日手工费统计分页
     */
    PageResult<ShopDayStatisticsDO> getDayStatisticsPage(ShopDayStatisticsPageReqVO pageReqVO);

    /**
     * 获得每日手工费统计列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 每日手工费统计列表
     */
    List<ShopDayStatisticsDO> getDayStatisticsList(ShopDayStatisticsExportReqVO exportReqVO);


    Boolean recordOrder(ShopOrderDO order, Boolean isNewMember, Long rechargeOrderCount);

    Boolean rollbackOrder(ShopOrderDO order);

    Boolean recordPayOrder(PayWalletRechargeDO payOrder, Long masterId, ChargeTypeEnum chargeType);

    Boolean recordTimesChargePay(Integer payPrice, Long memberId, Long masterId, ChargeTypeEnum chargeType, Long tenantId);

    List<ShopDayStatisticsDO> getDayStatisticsListByTime(LocalDateTime startTime, LocalDateTime endTime, Long tenantId);

    ShopDayStatisticsDO getDayStatisticsByDateId(String dateId, Long tenantId);

    void dayJob(List<Long> tenantIds);

}
